home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / P8_LOW.HAS < prev    next >
Text File  |  1996-11-18  |  4KB  |  149 lines

  1. *=======================================================
  2. *
  3. *    8bitPCM低音程変換
  4. *
  5. *=======================================================
  6.  
  7. PCM8_low:
  8.         move.w        CH_PITCH+2(a5),d3    * d3.w = PCM音程
  9.         move.w        CH_VOL(a5),d5        * d5.w = PCM VOLUME
  10.  
  11.         tst.b        CH_KEY_STAT(a5)        * keyon=$01 keyoff=$80 non=$00
  12.         bmi        PCM8_low_keyoff
  13.         bne        PCM8_low_keyon
  14.  
  15. *        通常の処理
  16.         move.w        CH_LAST_PCM(a5),d0    * d0.w = 前回変換終了時のPCM値
  17.         move.w        CH_PITCH_CTR(a5),d4    * d4.w = 音程カウンタ
  18.         movea.l        CH_PCM_ADR(a5),a0    * a0.l = PCMアドレス
  19.         movea.l        CH_TRAP_ADR(a5),a3    * a3.l = トラップアドレス
  20.         movea.l        CH_TRAP_ROUTINE(a5),a4    * a4.l = トラップ時の処理ルーチン
  21.  
  22.         movea.l        CH_JMP_ADR2(a5),a6
  23.         jmp        (a6)
  24.  
  25.  
  26. *        キーオンの処理
  27. PCM8_low_keyon:
  28.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  29.  
  30.         moveq.l        #0,d0            * d0.w = PCM予測値
  31.         move.w        d3,d4            * d4.w = 音程カウンタ
  32.         neg.w        d4            * d4.w =-増分(1回目でPCM変換するため)
  33.         movea.l        CH_TOP_ADR(a5),a0    * a0.l = PCM先頭アドレス
  34.  
  35.         move.l        CH_LPTIME(a5),d7    * ループ処理があるか?
  36.         moveq.l        #1,d1
  37.         cmp.l        d1,d7            * cmpi.l より4clk 速い
  38.         beq        1f
  39.         move.l        d7,CH_LPTIME_CTR(a5)    * ループ回数カウンタ初期化
  40.         movea.l        CH_LPEND_ADR(a5),a3    * a3.l = ループ終了アドレス
  41.         lea.l        PCM8_LPEND,a4        * a4.l = ループ終了処理アドレス
  42.         move.l        a3,CH_TRAP_ADR(a5)
  43.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  44.  
  45.         movea.l        CH_JMP_ADR2(a5),a6
  46.         jmp        (a6)
  47.  
  48. 1:        movea.l        CH_END_ADR(a5),a3    * a3.l = 16bit PCMデータ終了アドレス
  49.         lea.l        PCM8_END,a4        * a4.l = データ終了処理アドレス
  50.         move.l        a3,CH_TRAP_ADR(a5)
  51.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  52.  
  53.         movea.l        CH_JMP_ADR2(a5),a6
  54.         jmp        (a6)
  55.  
  56. *        キーオフの処理
  57. PCM8_low_keyoff:
  58.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  59.         clr.b        CH_PLAY_FLAG(a5)    * 演奏終了
  60.         jmp        make_keyoff_PCM        * 消音PCM展開
  61.  
  62. *=======================================================
  63.  
  64. PCM8_low_mac    macro        _vol
  65.  
  66.         move.l        CH_TPCNST(a5),d6
  67.         add.l        a0,d6
  68.         cmp.l        a3,d6
  69.         bcs        @f
  70.  
  71. *        トラップあり
  72.         moveq.l        #MIX_SIZE*2-1,d6
  73.  
  74. 3:        add.w        d3,d4            * 音程カウンタ += 音程
  75.         bcc        2f
  76.         cmpa.l        a3,a0            * データ終わった?
  77.         bcs        1f
  78.         jsr        (a4)            * トラップ!
  79. 1:        move.b        (a0)+,d0        * PCMデータ取り込み
  80.         ext.w        d0            * 符号拡張
  81. 2:    .if    _vol=8
  82.         add.w        d0,(a1)+
  83.     .else
  84.         move.w        d0,d1
  85.         VOLUME        _vol,d1,d7
  86.         add.w        d1,(a1)+
  87.     .endif
  88.         dbra        d6,3b
  89.  
  90.         move.w        d0,CH_LAST_PCM(a5)    * d0.w = 前回変換終了時のPCM値
  91.     .if    _vol=8
  92.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  93.     .else
  94.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  95.     .endif
  96.         move.w        d4,CH_PITCH_CTR(a5)    * d4.w = 音程カウンタ
  97.         move.l        a0,CH_PCM_ADR(a5)    * a0.l = PCMアドレス
  98.         rts
  99.  
  100.  
  101. *        トラップ無しの変換
  102. @@:        moveq.l        #MIX_SIZE*2-1,d6
  103.  
  104. 3:        add.w        d3,d4            * 音程カウンタ += 音程
  105.         bcc        2f
  106.         move.b        (a0)+,d0        * PCMデータ取り込み
  107.         ext.w        d0            * 符号拡張
  108. 2:    .if    _vol=8
  109.         add.w        d0,(a1)+
  110.     .else
  111.         move.w        d0,d1
  112.         VOLUME        _vol,d1,d7
  113.         add.w        d1,(a1)+
  114.     .endif
  115.         dbra        d6,3b
  116.  
  117.         move.w        d0,CH_LAST_PCM(a5)    * 変換終了時のPCM値
  118.     .if    _vol=8
  119.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  120.     .else
  121.         move.w        d1,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  122.     .endif
  123.         move.w        d4,CH_PITCH_CTR(a5)    * d4.w = 音程カウンタ
  124.         move.l        a0,CH_PCM_ADR(a5)    * a0.l = PCMアドレス
  125.         rts
  126.   
  127.         endm
  128.  
  129. *=======================================================
  130.  
  131. PCM8_low_v00:    PCM8_low_mac    0
  132. PCM8_low_v01:    PCM8_low_mac    1
  133. PCM8_low_v02:    PCM8_low_mac    2
  134. PCM8_low_v03:    PCM8_low_mac    3
  135. PCM8_low_v04:    PCM8_low_mac    4
  136. PCM8_low_v05:    PCM8_low_mac    5
  137. PCM8_low_v06:    PCM8_low_mac    6
  138. PCM8_low_v07:    PCM8_low_mac    7
  139. PCM8_low_v08:    PCM8_low_mac    8
  140. PCM8_low_v09:    PCM8_low_mac    9
  141. PCM8_low_v10:    PCM8_low_mac    10
  142. PCM8_low_v11:    PCM8_low_mac    11
  143. PCM8_low_v12:    PCM8_low_mac    12
  144. PCM8_low_v13:    PCM8_low_mac    13
  145. PCM8_low_v14:    PCM8_low_mac    14
  146. PCM8_low_v15:    PCM8_low_mac    15
  147. PCM8_low_vnn:    PCM8_low_mac    'n'
  148. PCM8_low_non:    PCM8_low_mac    'x'
  149.